在一個專案Build完成後,通常會跑一些測試來檢測這個專案到底能夠承受多少的流量與有沒有一些會影響使用者的BUG。上一篇文章我們講述了如何使用Jmeter,一個好用的壓力測試與API測試工具,今天我們來講一下如何去整合Jenkins與Jmeter,讓我們在Build -> Test 一氣呵成,同時也產出一目了然的測試報告給主管看。
首先,隨然與Jenkins的整合無關,但是如同本次挑戰的描述,我們要建立一個被Container包裹的美好世界,Jmeter能不能用Docker實現呢? 是可以的
參考自justb4/jmeter
第一步先clone一個repository並執行./build.sh
git clone https://github.com/justb4/docker-jmeter.git
cd docker-jmeter
./build.sh
第二步執行./test.sh
來確認一下是否有成功安裝,我們來檢查一下run.sh的code。
NAME="jmeter"
JMETER_VERSION=${JMETER_VERSION:-"5.4"}
IMAGE="justb4/jmeter:${JMETER_VERSION}"
# Finally run
docker run --rm --name ${NAME} -i -v ${PWD}:${PWD} -w ${PWD} ${IMAGE} $@
可以看到run.sh就是執行一個container,接著檢查一下test.sh
export TARGET_HOST="www.map5.nl"
export TARGET_PORT="80"
export TARGET_PATH="/kaarten.html"
export TARGET_KEYWORD="Kaartdiensten"
T_DIR=tests/trivial
# Reporting dir: start fresh
R_DIR=${T_DIR}/report
rm -rf ${R_DIR} > /dev/null 2>&1
mkdir -p ${R_DIR}
/bin/rm -f ${T_DIR}/test-plan.jtl ${T_DIR}/jmeter.log > /dev/null 2>&1
# **執行jmeter**
./run.sh -Dlog_level.jmeter=DEBUG \
-JTARGET_HOST=${TARGET_HOST} -JTARGET_PORT=${TARGET_PORT} \
-JTARGET_PATH=${TARGET_PATH} -JTARGET_KEYWORD=${TARGET_KEYWORD} \
-n -t ${T_DIR}/test-plan.jmx -l ${T_DIR}/test-plan.jtl -j ${T_DIR}/jmeter.log \
-e -o ${R_DIR}
echo "==== jmeter.log ===="
cat ${T_DIR}/jmeter.log
echo "==== Raw Test Report ===="
cat ${T_DIR}/test-plan.jtl
echo "==== HTML Test Report ===="
echo "See HTML test report in ${R_DIR}/index.html"
最重要的就是./run.sh
那段,他其實就是一個呼叫docker container的指令去進行測試,所以我們只要複製這一段就能在Jenkins上執行docker了。
其中jmeter是根據傳入的.jmx檔來進行測試的,其中如上看到的如TARGET_HOST的,所以我們專案可以建立一個新的資料夾專門去上傳要測試的.jmx文件來進行測試。
在專案資料夾內新增一個test資料夾來存放你的測試計畫,將上一篇所產生的jmx檔放入其中,jmx檔就是你的測試計畫。接著可以模仿test.sh、run.sh,寫一個屬於你的測試計畫,放在test資料夾內。
# 你的test.sh
#!/bin/bash
NAME="jmeter"
JMETER_VERSION=${JMETER_VERSION:-"5.4"}
IMAGE="justb4/jmeter:${JMETER_VERSION}"
T_DIR=test/press1
R_DIR=${T_DIR}/report
JMX_NAME=ThreadGroup
# Reporting dir: start fresh
rm -rf ${R_DIR} > /dev/null 2>&1
mkdir -p ${R_DIR}
/bin/rm -f ${T_DIR}/test-plan.jtl ${T_DIR}/jmeter.log > /dev/null 2>&1
# **執行jmeter**
docker run --rm --name ${NAME} -i -v ${PWD}:${PWD} -w ${PWD} ${IMAGE} \
-Dlog_level.jmeter=DEBUG -n -t ${T_DIR}/${JMX_NAME}.jmx -l ${T_DIR}/${JMX_NAME}.jtl \
-j ${T_DIR}/${JMX_NAME}.log -e -o ${R_DIR}
echo "==== jmeter.log ===="
cat ${T_DIR}/${JMX_NAME}.log
echo "==== Raw Test Report ===="
cat ${T_DIR}/${JMX_NAME}.jtl
echo "==== HTML Test Report ===="
echo "See HTML test report in ${R_DIR}/index.html"
完成後我們要在jenkins pipeline裡最後加上一個驅動jmeter的區塊:
# Jenkinsfile
stage("Test"){
steps{
echo "Testing begin testing"
sh "chmod +x -R ${env.WORKSPACE}"
sh "./test/test.sh"
}
}
完成後git push
到github上驅動jenkins自動integrate。